/***
 * @Description: 本文件主要是定义协议栈的一些工具类的执行函数，包括大小端转换等
 * @Author: Liverpool
 * @Date: 2024-05-19 16:10:53
 * @LastEditTime: 2024-05-19 16:12:54
 * @LastEditors: Liverpool
 */

#ifndef TOOLS_H
#define TOOLS_H

#include "system.h"
#include "config.h"
#include "netComman.h"

// 宏函数定义
// 网络编程大小端转换
// 字母定义：h -> host(主机)  n ->net(网络) s ->short(16位数据) l->long(32位数据)
#if NET_ENDIAN_LITTLE // 协议栈是小端存储
#define x_htons(value) swap_u16(value)
#define x_ntohs(value) swap_u16(value)
#define x_htonl(value) swap_u32(value)
#define x_ntohl(value) swap_u32(value)
#else // 协议栈是大端存储
#define x_htons(value)
#define x_ntohs(value)
#define x_htonl(value)
#define x_ntohl(value)
#endif

// 外部函数定义区
net_err_t tools_init(void);                                                                       // 工具模块相关功能的初始化函数
uint16_t checksum_16(uint32_t offset, void *buf, uint16_t len, uint32_t pre_sum, int complement); // 对16位的数据做校验和处理

// 内联函数定义区
/***
 * @description: (内联函数)对u16的数据类型做逆序处理
 * @Author: Liverpool
 * @Date: 2024-05-19 16:22:50
 * @return {*} 逆序完成的16位数据
 * @param {uint16_t} value 需要进行逆序操作的变量
 */
static inline uint16_t swap_u16(uint16_t value)
{
    uint16_t result = ((value & 0xFF) << 8) | (value >> 8) & 0xFF;
    return result;
}
/***
 * @description: (内联函数)对u32的数据类型做逆序处理
 * @Author: Liverpool
 * @Date: 2024-05-19 16:22:50
 * @return {*} 逆序完成的32位数据
 * @param {uint16_t} value 需要进行逆序操作的变量
 */
static inline uint32_t swap_u32(uint32_t value)
{
    uint32_t result =
        (((value >> 0) & 0xFF) << 24) | (((value >> 8) & 0xFF) << 16) | (((value >> 16) & 0xFF) << 8) | (((value >> 24) & 0xFF) << 0);
    return result;
}

#endif